package com.atguigu.gulimall.order.listener;

import com.alipay.api.AlipayApiException;
import com.atguigu.common.constant.order.PaymentConstant;
import com.atguigu.gulimall.order.config.PayContextStrategy;
import com.atguigu.gulimall.order.vo.alipay.AliPayAsyncVO;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.io.UnsupportedEncodingException;

/**
 *
 * @ClassName OrderPayedListener
 * @Description 订单支付成功监听器
 * @Author xufb
 * @Date 2024/5/11 17:10:05
 * @Version 1.0
 */
@RestController
@RequiredArgsConstructor
public class OrderPayedListener {

    private final PayContextStrategy payContextStrategy;

    /**
     * 支付宝支付异步通知
     * 只有支付成功会触发
     * 性能和可用性：同步回调会让支付宝服务器等待商户服务器的响应，
     * 如果商户服务器因为网络延迟、负载过高或者其他原因无法及时响应，
     * 可能会导致支付宝服务器的线程资源被阻塞，影响其他交易的处理。
     * 采用异步回调的方式可以避免这种情况，支付宝服务器可以立即释放资源并继续处理其他交易，
     * 从而提高系统的可用性和性能。
     *
     * 安全性：异步回调可以确保交易结果的及时性和一致性。
     * 支付宝在支付成功后会异步地向商户服务器发送交易结果通知，商户服务器收到通知后可以立即对交易结果进行处理和验证，
     * 确保交易的安全性。如果采用同步回调，由于商户服务器的响应可能会受到网络延迟等因素的影响，
     * 导致支付宝无法及时获取到交易结果，从而可能会给攻击者利用的机会。
     * @param request
     * @param asyncVo
     */
    @PostMapping(value = "/payed/ali/notify")
    public String handleAliNotify(HttpServletRequest request, AliPayAsyncVO asyncVo) throws UnsupportedEncodingException, AlipayApiException {
        asyncVo.setPayCode(PaymentConstant.PayType.ALI_PAY.getCode());// 封装付款类型
        Boolean result = payContextStrategy.notify(PaymentConstant.PayType.ALI_PAY, request, asyncVo);
        if (Boolean.TRUE.equals(result)) {
            return "success";// 返回success，支付宝将不再异步回调
        }
        return "error";
    }

    //@PostMapping(value = "/pay/notify")
    //public String asyncNotify(@RequestBody String notifyData) {
    //    //异步通知结果
    //    return orderService.asyncNotify(notifyData);
    //}

}